﻿//LINQ
//语言集成查询，允许再C#中直接使用类似SQL的语法操作数据
//支持数据源：集合、数据库、XML\JSON等

//2.核心组件
//查询语法：类似SQL的声明式语法，如：from..where..select
//方法语法：基于扩展方法的链式调用使用扩展方法和lamdba表达式如，Where()、Select()
//延迟执行：查询再遍历结果时才会执行，立即执行需要强制转换

//1.筛选 --Where
//Where是LinQ中的筛选操作符，用于集合中选择满足特定条件的元素
int[] numbers = { 1, 2, 3, 6, 7, 8 };
//查询语法
// var result = from n in numbers
//              where n > 5
//              select n;
//方法语法
var result = numbers.Where(n=>n>5);

foreach (var n in result)
{
    Console.WriteLine(n);
}

//投影 --select
//Selcet操作符用于将集合中的每个元素投影为新的形式，常用于转换或提取特定属性
int[] numbers1 = { 1, 2, 3 };
//查询语法:将每个数字平方
// var result1 = from n in numbers1
//               select n * n;

//方法语法：
var result1 = numbers1.Select(n=>n*n);
foreach (var n in result1)
{
    Console.WriteLine(n);
}

//排序
//排序操作不会修改原始集合，而是返回一个新的排序后的集合
//根据指定的键对集合进行排序
int[] numbers2 = { 3, 1, 4, 2 };
//查询语法
// var result2 = from n in numbers2
//               orderby n descending
//               select n;

//方法语法
var result2 = numbers2.OrderByDescending(n=>n);
foreach (var n in result2)
{
    Console.WriteLine(n);
}

//4.分组
//GroupBy 操作符用于根据指定的键将集合中的元素分组

//分组结果是一个包含键和对应元素集合的集合
int[] numbers3 = { 1, 2, 3, 4, 5 };
numbers3.Min();
//查询语法
// var result3 = from n in numbers
//               group n by n % 2 into g
//               select new { Key = g.Key, numbers = g };
//group n by n % 2表示将元素n按照n%2的结果进行分组
//into g将前面的分组结果赋值给新的范围变量g
//select new { Key = g.Key, numbers = g };表示将每个分组投影为一个匿名类型对象

//方法语法
var result3 = numbers3.GroupBy(n => n % 2).Select(g=>new {Key=g.Key,numbers=g});
foreach (var group in result3)
{
    Console.WriteLine($"Key：{group.Key}");
    foreach (var n in group.numbers)
    {
        Console.WriteLine(n);
    }
}

//5.连接  --Join
var people = new[]{
    new {Name="张三",CityId=1},
    new {Name="Bob",CityId=2}
};
var cities = new[]{
    new {Id=1,Name="北京"},
    new {Id=2,Name="上海"}
 };

//查询语法
// var result4 = from person in people
//               join city in cities on person.CityId equals city.Id
//               select new { PersonName = person.Name, CityName = city.Name };

//方法语法
var result4 = people.Join(
    cities,
    person=>person.CityId,
    city=>city.Id,
    (person,city)=>new
    {
        PersonName = person.Name,
        CityName=city.Name
    }
);

foreach (var item in result4)
{
    Console.WriteLine($"{item.PersonName}生活在{item.CityName}");
}